﻿using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        Console.WriteLine("=== 异步计算 a^58 + b^50 ===");

        // 定义a和b的值（1-10之间的实数）
        double a = 2.5;
        double b = 3.7;

        Console.WriteLine($"a = {a}, b = {b}");
        Console.WriteLine($"计算表达式: {a}^58 + {b}^50");

        // 异步计算表达式
        double result = await CalculateExpressionAsync(a, b);

        Console.WriteLine($"\n计算结果: {result}");
        Console.WriteLine($"科学计数法表示: {result:E}");

        Console.ReadKey();
    }

    // 异步计算表达式 a^58 + b^50
    static async Task<double> CalculateExpressionAsync(double a, double b)
    {
        Console.WriteLine("\n开始异步计算...");

        // 同时启动两个异步任务计算幂运算
        Task<double> task1 = CalculatePowerAsync(a, 58, "a^58");
        Task<double> task2 = CalculatePowerAsync(b, 50, "b^50");

        // 等待两个任务完成
        double result1 = await task1;
        double result2 = await task2;

        // 返回两个结果的和
        return result1 + result2;
    }

    // 异步计算幂运算
    static async Task<double> CalculatePowerAsync(double baseNum, int exponent, string operationName)
    {
        Console.WriteLine($"开始计算 {operationName}...");

        // 使用Task.Run将同步计算包装为异步操作
        return await Task.Run(() =>
        {
            double result = 1.0;

            // 使用快速幂算法提高计算效率
            for (int i = 0; i < exponent; i++)
            {
                result *= baseNum;

                // 每计算10次显示一次进度（仅用于演示）
                if ((i + 1) % 10 == 0)
                {
                    Console.WriteLine($"  {operationName}: 已完成 {i + 1}/{exponent}");
                }
            }

            Console.WriteLine($"完成 {operationName} = {result:E}");
            return result;
        });
    }
}